package com.gelian.geliansdk;

import com.gelian.geliansdk.callback.GlCallback;
import com.gelian.geliansdk.callback.QueryUpdateProgressCallback;
import com.gelian.geliansdk.callback.RequestDeviceValueCallback;
import com.gelian.geliansdk.callback.RequestUsersOfDeviceCallback;
import com.gelian.geliansdk.callback.QueryUploadProgresCallback;
import com.gelian.geliansdk.callback.RequestLatestVersionCallback;
import com.gelian.geliansdk.callback.RequestUploadTokenCallback;
import com.gelian.geliansdk.listener.GlDeviceValueListener;
import com.gelian.library.*;
import com.gelian.library.model.GlDevice;

import java.util.List;
import java.util.Map;
import java.util.Set;


/**
 * 与个联进行通信的处理类
 * 所有接口的回调方法里，均带有resultCode
 * 各个resultCode与请求状态的对应关系，在GlResultCode类中
 */
public class GlEngine {


    /**
     * 请求手机验证码(1分钟内最多请求一次；每天限制5条短信验证码)
     *
     * @param phoneNumber 手机号
     * @param callback    处理结果的回调对象
     */
    public static void requestPhoneIdentify(String phoneNumber, GlCallback callback) {
        b.requestPhoneIdentify("0086", phoneNumber, callback);
    }

    /**
     * 请求手机验证码(1分钟内最多请求一次；每天限制5条短信验证码)
     *
     * @param areacode    电话地区码
     * @param phoneNumber 手机号
     * @param callback    处理结果的回调对象
     */
    public static void requestPhoneIdentify(String areacode, String phoneNumber, GlCallback callback) {
        b.requestPhoneIdentify(areacode, phoneNumber, callback);
    }

    /**
     * 注册
     * <p>
     * 安卓app可以通过手机号码、密码及验证码在本平台注册用户。
     *
     * @param phoneNum 手机号
     * @param identify 验证码
     * @param pass     密码,内部加密，请传原始密码,加密过程不可逆，不会保存任何密码到本地
     * @param callback 处理结果的回调对象
     */
    public static void registerByPhoneNum(String phoneNum
            , String identify
            , String pass
            , GlCallback callback) {
        b.registerByPhoneNum("0086", phoneNum, identify, pass, callback);
    }

    /**
     * 注册
     * <p>
     * 安卓app可以通过手机号码、密码及验证码在本平台注册用户。
     *
     * @param areacode 地区码
     * @param phoneNum 手机号
     * @param identify 验证码
     * @param pass     密码,内部加密，请传原始密码,加密过程不可逆，不会保存任何密码到本地
     * @param callback 处理结果的回调对象
     */
    public static void registerByPhoneNum(String areacode
            , String phoneNum
            , String identify
            , String pass
            , GlCallback callback) {
        b.registerByPhoneNum(areacode, phoneNum, identify, pass, callback);
    }

    /**
     * 登录
     *
     * @param name     登录名，可能是手机、邮箱等
     * @param pass     密码,内部加密，请传原始密码,加密过程不可逆，不会保存任何密码到本地
     * @param callback 处理结果的回调对象
     */
    public static void login(String name
            , String pass
            , GlCallback callback) {
        b.login("0086", name, pass, callback);
    }

    /**
     * 登录
     *
     * @param areacode 地区码
     * @param name     登录名，可能是手机、邮箱等
     * @param pass     密码,内部加密，请传原始密码,加密过程不可逆，不会保存任何密码到本地
     * @param callback 处理结果的回调对象
     */
    public static void login(
            String areacode
            , String name
            , String pass
            , GlCallback callback) {
        b.login(areacode, name, pass, callback);
    }

    /**
     * 注销
     *
     * @param callback 处理结果的回调对象
     */
    public static void logout(GlCallback callback) {
        b.logout(callback);
    }

    /**
     * 密码重置
     * <p>
     * 手机app可以通过手机号码、验证码在本平台重置密码
     *
     * @param phoneNum 手机号
     * @param code     验证码
     * @param newPass  密码,内部加密，请传原始密码,加密过程不可逆，不会保存任何密码到本地
     * @param callback 处理结果的回调对象
     */
    public static void resetPassword(String phoneNum
            , String code
            , String newPass
            , GlCallback callback) {
        b.resetPassword("0086", phoneNum, code, newPass, callback);
    }

    /**
     * 密码重置
     * <p>
     * 手机app可以通过手机号码、验证码在本平台重置密码
     *
     * @param areacode 地区码
     * @param phoneNum 手机号
     * @param code     验证码
     * @param newPass  密码,内部加密，请传原始密码,加密过程不可逆，不会保存任何密码到本地
     * @param callback 处理结果的回调对象
     */
    public static void resetPassword(String areacode
            , String phoneNum
            , String code
            , String newPass
            , GlCallback callback) {
        b.resetPassword(areacode, phoneNum, code, newPass, callback);
    }


    /**
     * 密码修改
     * <p>
     * 手机app可以通过手机号码、旧密码在本平台修改密码
     *
     * @param phoneNum 手机号
     * @param oldPass  原密码
     * @param newPass  新密码
     * @param callback 处理结果的回调对象
     */
    public static void modifyPassword(String phoneNum, String oldPass, String newPass, GlCallback callback) {
        b.modifyPassword("0086", phoneNum, oldPass, newPass, callback);
    }

    /**
     * 密码修改
     * <p>
     * 手机app可以通过手机号码、旧密码在本平台修改密码
     *
     * @param areacode 地区码
     * @param phoneNum 手机号
     * @param oldPass  原密码
     * @param newPass  新密码
     * @param callback 处理结果的回调对象
     */
    public static void modifyPassword(String areacode, String phoneNum, String oldPass, String newPass, GlCallback callback) {
        b.modifyPassword(areacode, phoneNum, oldPass, newPass, callback);
    }


    /**
     * 手机号修改
     * <p>
     * 手机app可以通过原手机号码、密码、新手机号码、新手机号码申请的验证码申请在本平台修改绑定手机
     *
     * @param oldPhoneNum 原手机号
     * @param pass        密码
     * @param newPhoneNum 新手机号
     * @param newIdentify 新手机收到的验证码
     * @param callback    处理结果的回调对象
     */
    public static void modifyPhoneNum(String oldPhoneNum
            , String pass
            , String newPhoneNum
            , String newIdentify
            , GlCallback callback) {
        b.modifyPhoneNum("0086", oldPhoneNum, pass, "0086", newPhoneNum, newIdentify, callback);
    }

    /**
     * 手机号修改
     * <p>
     * 手机app可以通过原手机号码、密码、新手机号码、新手机号码申请的验证码申请在本平台修改绑定手机
     *
     * @param old_areacode 地区码
     * @param oldPhoneNum  原手机号
     * @param pass         密码
     * @param new_areacode 地区码
     * @param newPhoneNum  新手机号
     * @param newIdentify  新手机收到的验证码
     * @param callback     处理结果的回调对象
     */
    public static void modifyPhoneNum(String old_areacode
            , String oldPhoneNum
            , String pass
            , String new_areacode
            , String newPhoneNum
            , String newIdentify
            , GlCallback callback) {
        b.modifyPhoneNum(old_areacode, oldPhoneNum, pass, new_areacode, newPhoneNum, newIdentify, callback);
    }


    /**
     * 绑定设备
     *
     * @param imei     用户从获取到的设备列表里，得到某个设备的设备id
     * @param callback 处理结果的回调对象
     */
    public static void bindDevice(String imei, GlCallback callback) {
        b.bindDevice(imei, callback);
    }

    /**
     * 解绑设备
     *
     * @param imei     用户从获取到的设备列表里，得到某个设备的设备id
     * @param callback 处理结果的回调对象
     */
    public static void unbindDevice(String imei, GlCallback callback) {
        b.unbindDevice(imei, callback);
    }

    /**
     * 解绑设备
     *
     * @param imei     用户从获取到的设备列表里，得到某个设备的设备id
     * @param user_id  目标用户的id
     * @param callback 处理结果的回调对象
     */
    public static void unbindDevice(String imei, String user_id, GlCallback callback) {
        b.unbindDevice(imei, user_id, callback);
    }


    /**
     * 设备的管理员回复是否同意权限申请
     * <p>
     *
     * @param responseMessage 权限申请的唯一标识
     * @param isApprove       是否同意对方的申请
     * @param glBaseCallback  处理结果的回调对象
     */
    public static void responsePermission(String responseMessage, boolean isApprove, GlCallback glBaseCallback) {
        b.responsePermission(responseMessage, isApprove, glBaseCallback);

    }

    /**
     * 设备的管理员可以修改设备的名字
     * <p>
     *
     * @param imei     设备的唯一id
     * @param gl_name  新的设备名字
     * @param callback 处理结果的回调对象
     */
    public static void modifyDeviceName(String imei, String gl_name, GlCallback callback) {
        b.modifyDeviceName(imei, gl_name, callback);

    }


    /**
     * 设备的管理员可以修改设备的属性，
     * 1、当设备处于私有状态的时候，其他人绑定或控制该设备需要管理员的审核；
     * 2、当设备处于公共状态的时候，任何人都可以直接绑定或控制该设备
     * <p>
     *
     * @param imei     设备的唯一id
     * @param property 设备属性(如:GlConstant.DEVICE_PROPERTY_PRIVATE，代表私有状态)
     * @param callback 处理结果的回调对象
     */
    public static void modifyDeviceProperty(String imei
            , String property
            , GlCallback callback) {
        b.modifyDeviceProperty(imei, property, callback);
    }


    /**
     * 设备管理员获取绑定该设备的所有用户
     * <p>
     * 返回的对象中
     *
     * @param imei     设备的唯一id
     * @param callback
     */
    public static void requestUsersOfDevice(String imei, RequestUsersOfDeviceCallback callback) {
        b.requestUsersOfDevice(imei, callback);

    }


    /**
     * 手机发送消息到个联设备
     *
     * @param imei     用户从获取到的设备列表里，得到某个设备的设备id
     * @param payload  透传数据，调用者可以自定义其中的内容，传递到设备
     * @param callback 处理结果的回调对象
     */
    public static void sendPayloadToDevice(String imei, byte[] payload, GlCallback callback) {
        b.sendPayloadToDevice(imei, payload, callback);
    }

    /**
     * 手机透传消息到服务器
     *
     * @param payload  透传数据，调用者可以自定义其中的内容
     * @param callback 处理结果的回调对象
     */
    public static void sendPayloadToServer(byte[] payload, GlCallback callback) {
        b.sendPayloadToServer(payload, callback);
    }

    /**
     * 手机透传消息到其他手机
     *
     * @param areacode       地区码
     * @param targetPhoneNum 目标手机号
     * @param payload        透传数据，调用者可以自定义其中的内容
     * @param callback       处理结果的回调对象
     */
    public static void sendPayloadToPhone(String areacode, String targetPhoneNum, byte[] payload, GlCallback callback) {
        b.sendPayloadToPhone(areacode, targetPhoneNum, payload, callback);
    }

    /**
     * 获取目前使用SDK的版本号
     *
     * @return versionName
     */
    public static String getSDKVersion() {
        return b.getSDKVersion();
    }


    /**
     * 查询设备固件的最新版本
     * <p>
     * 回调方法里返回的对象包含最新版本下载地址和版本号等信息
     *
     * @param imei                         要查询版本的设备id
     * @param requestLatestVersionCallback 请求设备版本的回调对象
     */
    public static void requestDeviceLatestVersion(String imei,
                                                  RequestLatestVersionCallback requestLatestVersionCallback) {
        b.requestDeviceLatestVersion(imei, requestLatestVersionCallback);
    }


    /**
     * 获取设备列表。
     * <p>
     * 调用本方法的同时，sdk内部会联网获取最新数据，并且在个联监听对象的deviceListChange()方法中返回最新设备列表的数据。
     * <p>
     * <p>
     * 返回的数据中包括设备名字，设备类型，设备在线状态，设备绑定状态等信息
     */
    public static List<GlDevice> getDeviceList() {
        return b.getDeviceList();
    }

    /**
     * 手动登记一个设备
     *
     * @param imei 由个联开放平台分配的imei
     * @param pin  由个联开放平台分配的pin
     * @return success    返回boolean值（代表成功或者失败）
     */
    public static boolean addDeviceInfo(String imei
            , String pin
    ) {
        return b.addDeviceInfo(imei, pin);
    }


    /**
     * 设备的管理员可以升级设备固件
     * <p>
     *
     * @param imei     设备的唯一id
     * @param callback 处理结果的回调对象
     */
    public static void updateDeviceVersion(String imei, GlCallback callback) {
        b.updateDeviceVersion(imei, callback);

    }

    /**
     * 查询设备固件更新进度
     * <p>
     *
     * @param imei     设备的唯一id
     * @param callback 处理结果的回调对象
     */
    public static void queryUpdateProgress(String imei, QueryUpdateProgressCallback callback) {
        b.queryUpdateProgress(imei, callback);

    }


    /**
     * 获取设备提供的数据
     *
     * @param imei
     * @param deviceRequestSet
     * @param callback
     */
    public static void requestDeviceValue(String imei
            , Set<Integer> deviceRequestSet
            , RequestDeviceValueCallback callback
    ) {
        b.requestDeviceValue(imei, deviceRequestSet, callback);
    }

    /**
     * 控制设备
     *
     * @param imei
     * @param deviceControlMap
     * @param callback
     */
    public static void controlDevice(String imei
            , Map<Integer, Object> deviceControlMap
            , GlCallback callback) {

        b.controlDevice(imei, deviceControlMap, false, callback);
    }


    public static void setDeviceValueListener(GlDeviceValueListener listener) {
        b.setDeviceValueListener(listener);
    }


    /**
     * 文件分享 - 手机至设备
     * <p>
     * 用户将手机文件上传到云平台之后,可以将该文件信息同步给设备
     *
     * @param imei     设备的id
     * @param filename 文件名
     * @param taskid   上传任务id
     * @param crc      文件的crc校验码
     * @param key      上传文件的key
     * @param des_key  Des解密秘钥
     * @param error    错误信息
     * @param state    0：开始上传，1：上传成功；2：上传失败
     * @param callback 回调对象
     */
    public static void shareFileToDevice(String imei
            , String filename
            , String taskid
            , String crc
            , String key
            , String des_key
            , String state
            , String error
            , GlCallback callback) {
        b.shareFileToDevice(imei, filename, taskid, crc, key, des_key, state, error, callback);
    }


    /**
     * 查询设备上传文件进度
     *
     * @param imei     设备的id
     * @param filename 文件名
     * @param taskid   任务id
     * @param callback 回调对象
     */
    public static void queryFileUploadProgress(String imei
            , String filename
            , String taskid
            , QueryUploadProgresCallback callback) {
        b.queryFileUploadProgress(imei, filename, taskid, callback);
    }

    /**
     * 获取文件上传凭证
     *
     * @param callback 回调对象,用来接收从云端获取到的token
     */
    public static void requestFileUploadToken(RequestUploadTokenCallback callback) {
        b.requestFileUploadToken(callback);
    }


}
